# 定义空元组
info = ()
info1 = tuple()
# print(info)
# print(info1)
# 非空
info2 = (11, 22, 33, 44)
# print(info2)Z
# # 单个元素
# info3 = ("55") # 不加逗号此时为：<class 'str'>
info3 = ("55",)
# print(type(info3))  # <class 'tuple'>
# # 不写括号
info4 = 1, 2, 3, 4
# print(type(info4))  # <class 'tuple'>
# 结论： 1. 元组的括号可以省略
# 2. 元组是一个元素值时，需要在元素后面加逗号

#元组元素查询：索引
# 语法格式：元组名[索引]
info = (11, "aaa", 1.88)
# 查看下标为2对应元素
# print(info[2])  # 1.88
# 查看下标为4对应元素
# print(info[4]) # IndexError: tuple index out of range
# 总结：
# 1.如果下标存在，直接查询对应位置的元素；下标不存在直接报错

# 元组元素查询：元素统计
# 语法格式：元组名.count(元素）
info = (1, 2, 3, 2)
# print(info.count(2))  # 出现2次
# print(info.count(3))  # 出现1次
# print(info.count(4))  # 出现0次


# 定义变量
num1 = 100
num2 = 200
# 交换两个数据
# 方式1：找第三个变量，进行互换
tmp = num1
num1 = num2
num2 = tmp
# print("此时num1的值：", num1)
# print("此时num2的值：", num2)

# 方式2：直接借助于python元组类型的数据直接替换
aa = 200 # 相当于把200给aa
bb = 100 # 相当于把100给bb
num1 = aa   #num1 = 200
num2 = bb   #num2 = 100
# 合并结果 # num1, num2 = 200, 100
num1, num2 = num2, num1  # 元组元素的外层小括号可以省略
# print("此时num1的值：", num1)
# print("此时num2的值：", num2)

# 元组和列表的区别：①表现形式不同，元组用小括号。列表用中括号
#               ②表示单个元组元素时，元素后必须加，
#               ③操作数据本质不同，元组是不可变数据类型，列表是可变数据类型

# 定义空字典
# 用{}定义：字典变量名 = {}
# 类实例化方式定义：字典变量名 = dict()
info = {}
info1 = dict()
# print(type(info), type(info1))
# print(info)

# 非空字典
#  字典变量名 = {键1：值1，键2：值2，.....}
info2 = {"name": "张三", "age": 22, "height": 1.88}
# print(info2)
# print(type(info2))
# 结论： 1.键名不能重复
# 2.键的数据类型可以任意（推荐用字符串）

# 字典新增或修改值
# 语法格式：字典名[键]=值
info = {"name": "张三"}
# 将张三修改为李四
info["name"] = "李四"
# 查看原有字典
# print(info)
# 增加年龄为22岁
info["age"] = 22
# print(info)  # {'name': '李四', 'age': 22}
# 结论：字典中键存在修改值，不存在新增键和值


# 字典删除值
# 语法格式：字典名.pop(键)
info = {'name': '李四', 'age': 22}
# 删除年龄22
info.pop("age")
# 查看原来字典
# print(info)
# # 删除性别
# info.pop("sex") # KeyError: 'sex'
# 结论：键存在直接删除对应键和值，键不存在报错


# 定义非空字典
# 字典中取值，语法格式：①变量 = 字典名[键]
#                  ②变量 = 字典名.get(键)
info = {
    "name": "tom",
    "age": 18,
    "gender": "男",
    "hobby": {"read": "小说", "sport": ["篮球", "足球"]}
}

# 查询年龄
a1 = info["age"]  #格式1   变量 = 字典名[键]
# print(a1)
# print(info["age"])
a2 = info.get("age")  #格式2  变量 = 字典名.get(键)
# print(a2)
# print(info.get("age"))
# 查询键aa的值
# print(info["aa"])  # 代码报错：KeyError: 'aa'  键aa不存在
# print(info.get("aa"))  # None 表示aa键不存在
# 如何获取值："足球"
a1 = info["hobby"]
# print(a1)  # {'read': '小说', 'sport': ['篮球', '足球']}
# print(a1["sport"])  # ['篮球', '足球']
# print(a1["sport"][1])
# 组合:从外部一层一层获取递进
# print(info["hobby"]["sport"][1])
# print(info.get("hobby").get("sport")[1])
# 结论：
#  1.键存在，两个方法无区别，如果键不存在，get方法直接返回None，但是通过键直接查询会报错

# 字典的合并/新增
# 语法格式：字典2.update(字典1)
dict1 = {"name": "张三", "age": 18}
dict2 = {"height": 1.88}
# 将字典2合并到字典1
dict1.update(dict2)
# print(dict1)


# 字典的遍历
# 语法格式：
# 遍历字典键：for 临时变量 in 字典名.keys():
# 遍历字典值：for 临时变量 in 字典名.values():
# 遍历键和值：for 键变量，值变量 in 字典名.items():
# 定义非空字典
info = {
      "name": "tom",
      "age": 18,
      "gender": "男"
  }
# 遍历获取字典中所有键
# for i in info.keys():
#     print(f"字典的键是：{i}")
# 遍历获取字典中所有值
# for i in info.values():
#     print(f"字典的值是：{i}")
# 遍历获取字典的键和值
for k, v in info.items():
    print(f"{k} = {v}")





